<!doctype html>
<html lang=ru id=faq>

<!-- If you make edits to any FAQ documents, please start each sentence
     on a new line, and try to keep the general formatting consistent
     with the rest of the pages -->

<title>OpenBSD FAQ: Собираем систему из исходников</title>
<meta charset=utf-8>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" type="text/css" href="../openbsd.css">
<link rel="canonical" href="https://www.openbsd.org/faq/faq5.html">

<h2 id=OpenBSD>
<a href="../index.html">
<i>Open</i><b>BSD</b></a>
FAQ - Собираем систему из исходников
<small>
<a href="index.html">[FAQ - На главную]</a>
</small>
</h2>
<hr>

<ul>
  <li><a href="#Flavors"    >OpenBSD's Flavors</a>
  <li><a href="#Snapshots"  >Разрабатываемые cнапшоты (snapshots)</a>
  <li><a href="#Bld"        >Собираем OpenBSD из исходников</a>
  <li><a href="#Release"    >Cборка релиза</a>
  <li><a href="#Xbld"       >Собираем X</a>
  <li><a href="#buildprobs" >Распростаненные проблемы при компиляции</a>
  <li><a href="#Miscellanea">Разные вопросы и советы</a>
  <li><a href="#Custom"     >Собственное ядро</a>
  <li><a href="#Diff"       >Подготовка Diff</a>
</ul>
<hr>

<h2 id="Flavors">OpenBSD's Flavors</h2>

Существует три flavors (разновидности, ветки) OpenBSD:

<ul>
  <li><b>-release:</b> Ветка (релиз) OpenBSD, выпускаемая каждые шесть месяцев.
  <li><b>-current:</b> Разрабатываемая ветка или версия.
      Каждые шесть месяцев -current замораживается, и эта ветка становится
      следующим -release.
  <li><b>-stable:</b> Ветка -release, плюс патчи, которые перечисленны на
      <a href="../errata.html">странице errata</a>.
      Самые важные исправления, сделанные для -current, так же добавляются (backported)
      во все поддерживаемые -stable ветки.
</ul>

Только для двух последних версий (релиза) OpenBSD доступны
<a href="faq10.html#Patches">исправления и патчи безопасности</a>
для базовой части ОС (base system).

<p>
Большинству пользователей рекомендуется использовать либо -stable либо -release.
Как уже было сказано, многие пользователи используют -current, и, что очень важно,
некоторые делают это для обнаружения ошибок и тестирования новых возможностей и
функциональности.

<h2 id="Snapshots">Разрабатываемые Snapshot'ы</h2>

Между официальными релизами OpenBSD выкладываются также snapshot'ы на основе
-current ветки. Это просто сборки скомпилированного кода, который сейчас находится
в репозитории.

<p>
Последний доступный snapshot это все, что обычно необходимо для запуска -current.
Если вы хотите собрать все из исходников, используйте только последний доступный
snapshot.
Этого можно добиться при помощи опции <code>-c</code> утилиты
<a href="https://man.openbsd.org/susupgrade">sysupgrade(8)</a>.
Проверьте страницу о
<a href="https://www.openbsd.org/faq/current.html">последних -current и использования snapshots</a>,
чтобы ознакомиться с последними изменениями конфигурации или дополнительными
шагами, необходимыми для сборки из исходников.

<p>
Не исключено, что вы обнаружите ошибки в snapshots.
Собственно это и является причиной, почему они собираются и доступны всем для
скачивания.
Если вы нашли баг, не стесняйтесь <a href="../report.html">сообщить</a> о нем,
если этого еще не сделал кто-то другой.

<h2 id="Bld">Собираем OpenBSD из исходников</h2>

Сборка OpenBSD из исходников включает в себя последовательность из нескольких шагов:

<ul>
  <li>Обновление до самых последних версий бинарников
  <li>Загрузка исходников
  <li>Сборка ядра (kernel) и пользовательских программ (userland), как объясняется
      в шагах 2 и 3 руководства <a href="https://man.openbsd.org/release">release(8)</a>
  <li>Необязательно, но можно <a href="#Release">making a release</a> и
      <a href="#Xbld">собрать X</a>
</ul>

Этот раздел FAQ расскажет и поможет в подготовке, необходимой для
описанных выше шагов. Основное руководство по этой теме находится в
<a href="https://man.openbsd.org/release">release(8)</a>.

<h3 id="BldBinary">Обновление бинарников до следующих доступных версий</h3>

Не пытайтесь обновляться с одного релиза до другого путем компиляции
исходного кода.

<p>
Проверьте и убедитесь, что у вас установлена самая последняя доступная
версия системы. Это должна быть либо OpenBSD x.y-release, если вы хотите
обновиться до OpenBSD x.y-stable, либо последний snapshot, если вы хотите
обновиться до -current.

<h3 id="BldGetSrc">Загрузка исходников</h3>

OpenBSD использует систему контроля версий
<a href="https://savannah.nongnu.org/projects/cvs">CVS</a>
для работы с исходниками.
Программа <a href="https://man.openbsd.org/cvs">cvs(1)</a>
используется для загрузки исходников на вашу машину для дальнейшей
компиляции.
Краткую информацию по программе, введение, можно найти в
<a href="https://man.openbsd.org/cvs">cvs(1)</a>,
а более детальная докуменация, включающая примеры работы с деревом
исходников, находится на специальной странице о
<a href="../anoncvs.html">анонимных CVS</a>.
Сначала вы должны загрузить себе содержимое репозитория при помощи
команды <code>cvs checkout</code>. После этого, чтобы обновить уже
существующие или дозагрузить новые файлы из того же репозитория, надо
будет сделать <code>cvs update</code>.
Вы так же можете настроить и поддерживать свой локальный CVS репозиторий
при помощи программы <code>reposync</code>, доступной в виде
<a href="faq15.html">пакета</a>.
О настройке зеркала репозитория рассказывается на странице,
посвященной <a href="../anoncvs.html#rsync">анонимному CVS</a>.


<h4 id="wsrc">Избегайте Root привилегий</h4>

Избегайте использование <a href="https://man.openbsd.org/cvs">cvs(1)</a>
от root. Каталог <code>/usr/src</code> (где обычно находятся загруженные
исходники) открыт на запись для участников группы <code>wsrc</code> по
умолчанию, так что добавьте пользователей, которым нужно пользоваться
<a href="https://man.openbsd.org/cvs">cvs(1)</a>, в эту группу.

<pre class="cmdbox">
# <b>user mod -G wsrc exampleuser</b>
</pre>

Изменения вструпят в силу после следующего входа в систему этого пользователя.

<p>
Если вы хотите загрузить исходники xenocara или портов от имени этого
пользователя, потребуется создать каталог и установить права доступа вручную.

<pre class="cmdbox">
# <b>cd /usr</b>
# <b>mkdir -p   xenocara ports</b>
# <b>chgrp wsrc xenocara ports</b>
# <b>chmod 775  xenocara ports</b>
</pre>

<h4>Загрузка -stable</h4>

Для загрузки -stable <code>src</code> дерева исходников, укажите branch,
который вам нужен, при помощи параметра <code>-r</code>:

<pre class="cmdbox">
$ <b>cd /usr</b>
$ <b>cvs -qd anoncvs@anoncvs.example.org:/cvs checkout -rOPENBSD_6_7 -P src</b>
</pre>

После того как вы загрузили исходники, вы можете обновить/синхронизировать
дерево в любое время при помощи следующих команд:

<pre class="cmdbox">
$ <b>cd /usr/src</b>
$ <b>cvs -q up -Pd -rOPENBSD_6_7</b>
</pre>

Замените <code>src</code> на <code>xenocara</code> или <code>ports</code>
в зависимости от того, что именно вы планируете сделать.
Так как все части OpenBSD тесно взаимосвязаны между собой, все деревья
с исходниками, с которыми вы работаете, должны загружаться и обновляться синхронно.

<h4>Загрузка -current</h4>

Для загрузки -current <code>src</code> дерева исходников, воспользуйтесь
следующими командами:

<pre class="cmdbox">
$ <b>cd /usr</b>
$ <b>cvs -qd anoncvs@anoncvs.example.org:/cvs checkout -P src</b>
</pre>

Обновить их можно можно вот так:

<pre class="cmdbox">
$ <b>cd /usr/src</b>
$ <b>cvs -q up -Pd -A</b>
</pre>

Замените <code>src</code> на необходимый вами модуль, такой как <code>xenocara</code>
или <code>ports</code>.

<h3>Сборка OpenBSD</h3>

Наконец-то вы готовы приступить к сборке OpenBSD из исходников.

<p>
Если вы собираете -current, просмотрите изменения, а также специальные
инструкции по сборке, перечисленные на
<a href="https://www.openbsd.org/faq/current.html">этой странице</a>.

<p>
Следуйте детальным инструкциям, описанным в шагах 2 и 3 руководства по
<a href="https://man.openbsd.org/release">release(8)</a>.

<h3>Дополнительная информация по процессу собрки</h3>

<ul>
  <li><a href="https://man.openbsd.org/mk.conf">mk.conf(5)</a>
  <li><a href="https://cvsweb.openbsd.org/src/Makefile">
    <code>src/Makefile</code></a>
  <li><a href="https://cvsweb.openbsd.org/src/share/mk/bsd.README">
    <code>/usr/share/mk/bsd.README</code></a>
  <li><a href="https://man.openbsd.org/config">config(8)</a>
  <li><a href="https://man.openbsd.org/options">options(4)</a>
</ul>

<h2 id="Release">Сборка релиза</h2>

Релиз - это полный комплект файлов, который может быть использован для
установки или обновлении OpenBSD на другом компьютере.
В качестве примера необходимости сборки релиза можно рассмотреть ситуацию,
когда вы собираете -stable на быстром компьютере, с целью последующей установки
собранного релиза на другие машины.
Если у вас только один компьютер с OpenBSD, у вас нет никакой необходимости
собирать релиз, поскольку описанные выше действия уже сделали все необходимое
для вас.

<p>
Инструкции по сборке релиза находятся в
<a href="https://man.openbsd.org/release">release(8)</a>.
Этот процесс использует бинарники в <code>/usr/obj</code>, процесс создания
которых описывался выше.

<p>
Замечание: если вы захотите использовать эти файлы для установки или обновлении
через/используя HTTP(S), создайте файл <code>index.txt</code>, который будет
содержать список всех файлов, вошедьших в новый релиз.

<pre class="cmdbox">
# <b>ls -nT > index.txt</b>
</pre>

Если вы хотите подписать созданные файлы, man-страница по
<a href="https://man.openbsd.org/signify">signify(1)</a> расскажет как
это сделать.

<h3>Настройка вашей системы</h3>

Создание релиза требует наличие <code>noperm</code>-раздела.
Это позволит инфраструктуре сборки использовать непривилегированного
пользователя <code>build</code> для большей части процесса.

<p>
Создайте ФС на <code>/dest</code> с установленной <code>noperm</code>
<a href="https://man.openbsd.org/mount">mount(8)</a> опцией.

Соответствующая <a href="https://man.openbsd.org/fstab">fstab(5)</a>
строка должна быть похожа на эту:
<pre class="cmdbox">
c73d2198f83ef845.m /dest ffs rw,nosuid,noperm 1 2
</pre>

Владельцем (owner) этой ФС должен быть пользователь <code>build</code>,
который имеет там права <code>700</code>:

<pre class="cmdbox">
# <b>chown build /dest</b>
# <b>chmod 700   /dest</b>
</pre>

Создайте каталог <code>DESTDIR</code> для base и xenocara:

<pre class="cmdbox">
# <b>mkdir /dest/{,x}base</b>
</pre>

Ваша <code>RELEASEDIR</code> не обязательно должна быть на <code>noperm</code>
ФС. Удоставерьтесь, что она пренадлежит пользователю <code>build</code> и имеет
права <code>u=rwx</code>.

<h3>Использование noperm mfs раздела</h3>

Вы можете использовать <a href="https://man.openbsd.org/mount_mfs">mfs</a>
раздел вместо физического диска.
Это можно сделать добавив похожую строчку в ваш <code>/etc/fstab</code>:

<pre class="cmdbox">
swap /dest mfs rw,nosuid,noperm,-P/var/dest,-s1.5G,noauto 0 0
</pre>

Создайте прототип каталога <code>DESTDIR</code>:

<pre class="cmdbox">
# <b>mkdir -p /var/dest/{,x}base</b>
# <b>chown -R build /var/dest</b>
# <b>chmod -R 700   /var/dest</b>
</pre>

Теперь вы можете подмонтировать <code>/dest</code> до того как приступили
к сборке релиза:

<pre class="cmdbox">
# <b>mount /dest</b>
</pre>

<h2 id="Xbld">Собираем X</h2>

Начиная с 7-ой версии, <a href="https://www.x.org/wiki/">X.Org</a>
стал использовать модульную систему сборки, разделив исходники X.org
на более трехсот более или менее связанных друг с другом пакетов.

<p>
Чтобы упростить жизни пользователям OpenBSD, была разработана система,
получившая название <a href="https://xenocara.org">Xenocara</a>.
Эта система "конвертирует" X обратно в одно общее большее дерево исходных
кодов. В качестве дополнительного бонуса, этот процесс сборки стал похож
на аналогичные процессы, используемые остальными компонентами OpenBSD.

<p>
Официальные инструкции по сборке X находятся в файле
<a href="https://cvsweb.openbsd.org/xenocara/README">
<code>xenocara/README</code></a>, а так же описаны в пятом шаге
<a href="https://man.openbsd.org/release">release(8)</a>.

<h2 id="buildprobs">Распростаненные проблемы при компиляции</h2>

Чаще всего к проблемам при сборке приводит невнимательность.
Есть отдельные проблемы при сборке -current из-за новых изменений коде,
но проблемы при сборке -release или -stable чаще всего вызваны ошибками
самого пользователя.

<p>
Чаще всего можно столкнуться со следующими:

<ul>
  <li>Не получается собрать или запустить <a href="#BldBinary">тот или иной бинарник</a>.
  <li><a href="#BldGetSrc">Загрузка</a> не того branch с исходниками.
  <li>Забыли ознакомиться с
      <a href="https://www.openbsd.org/faq/current.html">докуменацией о -current</a>
      до того как начать сборку.
  <li>Забили пререзагрузиться после сборки и установки нового ядра.
</ul>

<h3 id="ProbObj">Я забыл сделать <code>make obj</code> перед <code>make build</code></h3>

Выполнение <code>make build</code> до <code>make obj</code> приведет к тому, что
целая куча объектных файлов будет разбросана в <code>/usr/src</code> каталоге.
Это плохо. Чтобы не загужать исходники (src tree) снова, удалите obj-файлы:

<pre class="cmdbox">
$ <b>cd /usr/src</b>
$ <b>find . -type l -name obj -delete</b>
$ <b>make cleandir</b>
$ <b>rm -rf /usr/obj/*</b>
$ <b>make obj</b>
</pre>

<h3 id="sig11">Сборка останавливается из-за ошибки "Signal 11"</h3>

Сборка OpenBSD и других программ из исходников гораздо сильнее нагружает
аппаратную часть машины (интенсивно используется процессор, жеский диск и
память), чем большинство других задач.
Signal 11 <i>обычно</i> возникает при аппаратных проблемах.

<p>
Имеет смысл починить или заменить компоненты, которые приводят к этой
проблеме, так как они скорее всего будут проявлять себя и в будущем.

<p>
Для получения дополнительной информации смотрите
<a href="https://www.bitwizard.nl/sig11/">Sig11 FAQ</a>.


<h2 id="Miscellanea">Разные вопросы и советы</h2>

<h3>Добавьте себя в группу <code>wobj</code></h3>

Если вы собираетесь скомпилировать отдельную программу в дереве с
исходниками -- например, внося изменения в ее код, т.е. занимаясь
разработкой -- вам понадобиться добавить себя в группу <code>wobj</code>.
Это даст вам права на запись в каталог <code>/usr/obj</code>.

<h3>Tag файлов</h3>

Так как <a href="https://man.openbsd.org/mg">mg(1)</a>
и <a href="https://man.openbsd.org/vi">vi(1)</a> являются редакторами
для разработчиков, они имеют встроенную поддержку файлов
<a href="https://man.openbsd.org/ctags">ctags(1)</a>, что позволяет
быстро перемещаться по дереву с исходниками.

<p>
Для большинства программ или архивов с исходниками (library source
directories), вы можете создать <code>./tags</code> файлы вот так:
<pre class="cmdbox">
$ <b>make tags</b>
</pre>

Во время сборки и установки <code>libc</code>, создается файл
<code>/var/db/libc.tags</code>.

<p>
По умолчанию, tags ядра для каждой архитектуры находится в
<code>/sys/arch/$(machine)/</code>.
Эти файлы могут быть созданы при помощи <code>make tags</code>, запущенной
в <code>/sys/kern</code>.
Вы можете выполнить <code>make links</code> от root, чтобы создать symlink
на <code>tags</code> файл вашего ядра в каждом каталоге и в
<code>/var/db/</code>.

<h3>Как я могу пропустить сборку той или иной части дерева?</h3>

Используй параметр <code>SKIPDIR</code> в
<a href="https://man.openbsd.org/mk.conf">mk.conf(5)</a>.

<h3>Как на счет кросскомпиляции?</h3>

Инструменты для кросскомпиляции в системе есть. Но они используются главным
образом разработчиками для портирования OpenBSD на новые платформы, и для
общего использования не поддерживаются.

<p>
Когда разработчики начинают поддерживать новую платформу, одним из первых
важнейших тестов является так называемый "native building", т.е. процесс
сборки системы на той же платформе, для которой она собирается.
Сборка системы из исходников значительно нагружает и саму ОС, и машину,
что само по себе является хорошим тестом работоспособности. По этой причине
в OpenBSD используется метод сборки всех компонентов на платформе, для которой
она собирается и на которой планируется использоваться.

<h2 id="Custom">Собственное ядро</h2>

Есть три возможности настройки ядра:

<ul>
  <li>Настройка во время загрузки, при использовании
    <a href="https://man.openbsd.org/boot_config">boot_config(8)</a>
  <li>Изменение настроек скомпилированного ядра, при помощи
    <a href="https://man.openbsd.org/config">config(8)</a>
  <li>Новая компиляция собственного ядра
</ul>

Прежде чем вы начнете, мы настоятельно рекомендуем вам сначала ознакомиться с
документацией о <a href="https://man.openbsd.org/config">config(8)</a>.

<h3 id="BootConfig">Настройка во время загрузки</h3>

Иногда можно столкнуться с ситуацией, когда ядро обнаруживает устройство,
но используется неправильное IRQ. В этом случае можно воспользоваться
<a href="https://man.openbsd.org/boot_config">boot_config(8)</a>, что даcт
возможность конфигурировать ядро на этапе загрузки, без
необходимости пересобирать его.

<p>
Тем не менее, этот метод исправит проблему только до следующей перезагрузки.
После перезагрузки вам снова придется повторять всю процедуру.
Другими словами, это одноразовое решение. Исправить проблему стоит при помощи
<a href="https://man.openbsd.org/config">config(8)</a>.

<p>
Для загрузки в User Kernel Config, или UKC, используйте опцию <code>-c</code>
при загрузке.

<pre class="cmdbox">
boot> <b>boot hd0a:/bsd -c</b>
</pre>

После этого появится приглашение UKC.
Используйте комадну <b><code>help</code></b> чтобы получить список доступных
команд.

<h3 id="config">Использование config(8) для изменения параметров ядра</h3>

Парамерты <code>-e</code> и <code>-u</code>, используемые
<a href="https://man.openbsd.org/config">config(8)</a>,
помогут сэкономить время, затрачиваемое на компиляцию ядра.
Параметр <code>-e</code> позволяет войти в UKC (User Kernel Config) на
работающей системе. Изменения вступят в силу после перезагрузки.
Параметр <code>-u</code> проверяет, были ли внесены изменения в ядро во
время загрузки, т.е. использовали ли вы параметр <code>boot -c</code>
для входа в UKC во время загрузки системы.

<p>
Для избежания проблем лучше воспользоваться опцией <code>-o</code> для
записи в указанный другой файл.
К примеру: <code>config -e -o bsd.new /bsd</code> запишет изменения в
<code>bsd.new</code>.

Примеры конфигурации ядра можно найти в man-странице для
<a href="https://man.openbsd.org/config">config(8)</a>.

<h3 id="Options">Сборка собственного ядра</h3>

Только <code>GENERIC</code> и <code>GENERIC.MP</code> ядра поддерживаются командой
разработчиков.
Конфигурация <code>GENERIC</code> ядра зависит от комбинации параметров в
<code>/sys/arch/$(machine)/conf/GENERIC</code>
и <code>/sys/conf/GENERIC</code>.
Сообщение о проблеме в собственно собраном ядре практически всегда приведет к
тому, что вам предложат попытаться воспроизвести проблему с <code>GENERIC</code>
ядром.

<p>
Ознакомьтесь с документацией для <a href="https://man.openbsd.org/config">config(8)</a>
и <a href="https://man.openbsd.org/options">options(4)</a>.
Следующие шаги являются частью процесса сборки собственного ядра:

<pre class="cmdbox">
$ <b>cd /sys/arch/$(machine)/conf</b>
$ <b>cp GENERIC CUSTOM</b>
$ <b>vi CUSTOM    # make your changes</b>
$ <b>config CUSTOM</b>
$ <b>cd ../compile/CUSTOM</b>
$ <b>make</b>
</pre>

<h2 id="Diff">Подготовока Diff</h2>

Если вы изменили что-то в коде OpenBSD и решили поделиться этими изменениями с
разработчиками, не забывайте о следующем:

<ul>
  <li>Ваш diff должен быть создан в -current.
  <li>Для создания diff'а используйте команду <code>cvs diff -uNp</code>.
  <li>Отправьте ваш diff в теле письма в <b>tech</b>
      <a href="../mail.html">рассылку</a>.
      Убедитесь заранее, что ваш почтовый клиент не искажает пробелы,
      и diff будет читабельным.
</ul>

Если вы используете <a href="https://github.com/openbsd">git зеркало</a>
с исходниками OpenBSD, в вашем репозитории нужно будет выполнить

<pre class="cmdbox">
$ <b>git config diff.noprefix true</b>
</pre>

после чего создать diff можно будет вот так:

<pre class="cmdbox">
$ <b>git diff --relative .</b>
</pre>
